package com.jacken.mars.commons.config;

import com.alibaba.fastjson.JSONObject;
import com.jacken.mars.utils.DateUtils;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.time.LocalDate;

/**
 * 全双工(客户端可以主动给服务器发送消息  服务器也可以主动给客服端响应消息)
 *
 * @author wangqiang
 * @version 1.0
 * @date 2021/2/10 20:29
 */
@Component
//ws://localhost:8080/websocket/userId
@ServerEndpoint(value = "/websocket/{userId}")
public class WebSocketEndPoint {

    private Session session;

    private static int chatCount;

    /**
     * 连接建立成功调用的方法
     *
     * @param session
     * @param userId
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {

        chatCount++;
        SessionPool.sessions.put(userId, session);
        String userName = "用户" + session.getId();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type", 0);
        jsonObject.put("message", userName + "上线啦");
        jsonObject.put("time", DateUtils.getTime());
        onMessage(jsonObject.toJSONString(), session);

    }


    /**
     * 关闭连接
     *
     * @param session
     * @throws IOException
     */
    @OnClose
    public void onClose(Session session) throws IOException {
        chatCount--;
        //移除Map中的key
        SessionPool.close(session.getId());
        //关闭会话
        session.close();
        String userName = "用户" + session.getId();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("type", 2);
        jsonObject.put("message", userName + "离开了聊天室");
        jsonObject.put("time", DateUtils.getTime());
        onMessage(jsonObject.toJSONString(), session);
    }

    /**
     * 服务端收到消息后调用的方法(群发)  消息类型  0  进入聊天室  1 普通消息  2 离开聊天室
     *
     * @param message
     * @param session
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        SessionPool.sendMessage(message);
    }


}
